
%x eot

%{
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>

//char *out_b;
int lineno = 1, last_lineno = 0;

void newline(){
	switch(lineno-last_lineno){
		case 0: case 1:
			printf("\n");
			break;
		default:
			printf("\n//@line %i\n", lineno);
	}
//	out_b += strlen(out_b);
	last_lineno = lineno;
}


void out(const char *fmt, ...){	
    va_list args;
    va_start(args, fmt);
    vprintf(fmt, args);
    va_end(args);
//    out_b += strlen(out_b);
}

%}

%%

\<\<EOT\n 		{ ++lineno; BEGIN(eot); }
<eot>EOT		{ BEGIN(INITIAL); }
<eot>\\			{ out("\\\\"); }
<eot>\"			{ out("\\\""); }
<eot>\n			{ ++lineno; out("\\n"); }
<eot>.			{ out("%s", yytext); }


#[^\n]*\n	{ ++lineno; newline(); }

\n	{ ++lineno; newline(); }

.	{ out("%s", yytext); }

<<EOF>>		{ yyterminate(); }





%%
 
int yywrap(void){return 1;}

main(){
	yylex();
}

